package com.keensense.vcm;

import com.keensense.vcm.model.*;
import com.keensense.vcm.model.enums.LanguageEnum;
import com.keensense.vcm.model.enums.TypeCodeEnum;

/**
 * @author lanjian
 * @date 2020/4/28 9:51 上午
 */
public interface VCM {

    /**
     * 登录
     */
    VCMResponse login();

    /**
     * Shuts down the VCM instance (release all resources) The VCM instance is not usable after its shutdown() is
     * called.
     */
    void shutDown();

    PeopleFaceSearchResponse searchPeopleFace(PeopleFaceSearchRequest request);

    /**
     * 查询单动态库N中人脸出现的频次，按照频次降序排序。
     *
     * @param nvNRequest
     * @return
     */
    NvNResponse faceMatchNvN(NvNRequest nvNRequest);

    /**
     * 根据taskId查询nvn结果集
     *
     * @param taskId
     * @return
     */
    NvNResponse getFaceMatchNvnResult(String taskId);

    /**
     * 根据特征搜索车辆
     *
     * @param request
     * @return
     */
    VehicleSearchResponse searchVehicle(VehicleSearchRequest request);

    /**
     * 根据图片搜索车辆
     *
     * @param request
     * @return
     */
    VehicleSearchResponse searchVehicleByPhoto(VehicleSearchByPhotoRequest request);

    /**
     * 1、创建智能分析任务。 2、不建议同时启动车牌识别和车辆识别任务。 3、VCM北向接口请求中可能新增可选字段，或响应中增加字段。 ISV客户端需支持过滤不使用的新增字段，进行兼容性处理。
     * 4、对同一摄像机或视频文件，不建议同时创建多个分析内容相近的的智能分析任务，例如车辆识别和人车混合结构化智能分析任务、人体识别和人车混合结构化智能分析任务。
     * 5、如果用户需要对不同算法的效果进行比较，可以对同一摄像机或视频文件，使用不同算法同时创建相同类型的智能分析任务。
     *
     * @param startIntelligentAnalysisRequest
     * @return
     */
    VCMResponse startIntelligentAnalysis(StartIntelligentAnalysisRequest startIntelligentAnalysisRequest);

    /**
     * 1、查询智能分析任务列表。 2、支持域间任务检索，可根据任务创建域和任务执行域查询智能分析任务。 3、VCM北向接口请求中可能新增可选字段，或响应中增加字段。 ISV客户端需支持过滤不使用的新增字段，进行兼容性处理。
     *
     * @param getIntelligentAnalysisListRequest
     * @return
     */
    GetIntelligentAnalysisListResponse
    getIntelligentAnalysisList(GetIntelligentAnalysisListRequest getIntelligentAnalysisListRequest);

    /**
     * 指定任务编码删除智能分析任务。
     *
     * @param taskId
     * @return
     */
    VCMResponse deleteIntelligentAnalysis(String taskId);

    /**
     * <p>
     * 1、增加人员档案，支持将静态库迁移到档案库。
     * </p>
     * <p>
     * 2、定时扫描静态库，将该静态库新增人员创建成档案
     * </p>
     *
     * @param addProfileRequest
     */
    VCMResponse addProfile(AddProfileRequest addProfileRequest);

    /**
     * <p>
     * 1、支持档案数据迁移，可以将某些过脸数据迁移归入某个档案
     * </p>
     *
     * @return
     */
    VCMResponse updateProfile(MigrateTrajectoryRequest migrateTrajectoryRequest);

    /**
     * <p>
     * 1、合并人员档案，支持多个档案合并，支持无名档合并，无名档合入有名档。
     * </p>
     *
     * @return
     */
    VCMResponse mergeProfile(MergeProfileRequest mergeProfileRequest);

    /**
     * <p>
     * 1、输入人员档案id的情况下会忽略其他信息。
     * </p>
     * 2、人员档案检索，以图搜档的情况下会忽略所有结构化信息。
     *
     * @param batchQueryProfileRequest
     * @return
     */
    BatchQueryProfileResponse queryProfile(BatchQueryProfileRequest batchQueryProfileRequest);

    /**
     * 查询所有档案库
     *
     * @return
     */
    QueryProfileLibrariesResponse queryAllProfileLibrary();

    /**
     * 查询人员档案库
     *
     * @param queryProfileLibrariesRequest
     * @return
     */
    QueryProfileLibrariesResponse queryProfileLibraries(QueryProfileLibrariesRequest queryProfileLibrariesRequest);


    /**
     * 根据id查询人员档案库
     *
     * @param pId
     * @return
     */
    QueryProfileLibrariesResponse queryProfileLibraryById(String pId);

    /**
     * 更新人员档案库，支持更新名字、描述、tag
     *
     * @param updateProfileLibrariesRequest
     * @return
     */
    VCMResponse updateProfileLibraries(UpdateProfileLibrariesRequest updateProfileLibrariesRequest);

    /**
     * <p>
     * <删除人员档案库/p>
     * <p>
     * 1、删除普通档案库，不删除档案，只删除档案和档案库的映射关系。
     * </p>
     * <p>
     * 2、删除有名档/无名档，直接删除档案，包括档案中的数据。
     * </p>
     *
     * @param id
     * @return
     */
    VCMResponse deleteProfileLibraries(String id);

    /**
     * 增加人员档案库，如重点人员档案库、高频档案库等，档案库的个数限制128
     *
     * @param addProfileLibrariesRequest
     * @return
     */
    AddProfileLibrariesResponse addProfileLibraries(AddProfileLibrariesRequest addProfileLibrariesRequest);

    /**
     * <p>
     * 人员档案删除
     * </p>
     * <p>
     * 1、删除档案后会自动删除静态库人员
     * </p>
     * <p>
     * 2、支持删除无名档案。
     * </p>
     * <p>
     * 3、若删除静态库数据，则档案变更为无名档案。
     * </p>
     *
     * @param dIds
     * @return
     */
    VCMResponse deleteProfile(String dIds);


    /**
     * 根据图片搜索档案
     *
     * @return
     */
    BatchQueryProfileResponse queryByPicture(QueryProfileByPictureRequest queryProfileByPictureRequest);

    /**
     * 人员档案统计接口，查询接口的两个字段互斥，不能同时填写。
     *
     * @return
     */
    StatisticArchivesResponse statisticProfile();

    /**
     * 手动添加人员档案
     * <p>
     * 1、添加档案必须指定静态库，档案会同步添加到静态库中。
     * </p>
     * <p>
     * 2、添加档案必须指定已经建档的静态库。
     * </p>
     *
     * @param manualCreateProfileRequest
     * @return
     */
    ManualCreateProfileResponse manualCreateProfile(ManualCreateProfileRequest manualCreateProfileRequest);

    /**
     * 根据档案id查询档案
     *
     * @param id
     * @return
     */
    BatchQueryProfileResponse queryProfileById(String id);

    /**
     * 查询档案过脸信息
     *
     * @param profileQueryFacesRequest
     * @return
     */
    ProfileQueryFacesResponse queryProfileFaces(ProfileQueryFacesRequest profileQueryFacesRequest);

    /**
     * 查询未归档过脸信息
     *
     * @param queryUnFiledFaceRequest
     * @return
     */
    ProfileQueryFacesResponse queryUnFiledFaces(QueryUnFiledFaceRequest queryUnFiledFaceRequest);

    /**
     * 更新档案
     *
     * @param updateProfileRequest
     * @return
     */
    VCMResponse updateProfile(UpdateProfileRequest updateProfileRequest);

    /**
     * 将档案从档案库中移除
     *
     * @param operationProfileFromLibraryRequest
     * @return
     */
    VCMResponse delProfileFromLibrary(OperationProfileFromLibraryRequest operationProfileFromLibraryRequest);


    /**
     * 添加人像到档案库
     *
     * @param operationProfileFromLibraryRequest
     * @return
     */
    VCMResponse addProfileToLibrary(OperationProfileFromLibraryRequest operationProfileFromLibraryRequest);


    /**
     * 批量添加人像到档案库
     *
     * @param batchAddProfileToLibraryRequest
     * @return
     */
    VCMResponse batchAddProfileToLibrary(BatchAddProfileToLibraryRequest batchAddProfileToLibraryRequest);

    /**
     * <P>
     * 1、查询历史告警信息
     * </P>
     * <p>
     * 2、新增可根据布控名单类型、算法编码或者命中类型查询告警信息
     * </p>
     * <p>
     * 3、支持pageSize=0，当pageSize=0是只返回总数，且是精确的
     * </p>
     * <p>
     * 4、新增返回摄像机的经纬度信息
     * </p>
     * <p>
     * 5、新增返回布控Id的列表
     * </p>
     * <p>
     * 6、VCM北向接口请求中可能新增可选字段，或响应中增加字段。 ISV客户端需支持过滤不使用的新增字段，进行兼容性处理
     * </p>
     * <p>
     * 7、接口响应增加url字段，用于下载布控名单图片
     * </p>
     * <p>
     * 8、接口响应增加suspectPictureId字段，表示布控图片id
     * </p>
     *
     * @param searchAlarmRequest
     * @return
     */
    SearchAlarmResponse searchAlarm(SearchAlarmRequest searchAlarmRequest);

    /**
     * 1、查询布控任务。
     * <P>
     * 2、VCM北向接口请求中可能新增可选字段，或响应中增加字段。 ISV客户端需支持过滤不使用的新增字段，进行兼容性处理。
     * </p>
     *
     * @param searchSuspectTaskRequest
     * @return
     */
    SearchSuspectTaskResponse searchSuspectTask(SearchSuspectTaskRequest searchSuspectTaskRequest);

    /**
     * 1:1人脸比对。image2 为对比基准图片。
     *
     * @return
     */
    OneVOneResponse faceOneVOne(OneVOneRequest oneVOneRequest);

    /**
     * 根据过脸记录Id查询过脸详细信息
     *
     * @param recordId
     * @return
     */
    SnapInfosResponse getSnapInfos(String... recordId);

    ListCameraResponse listCamera(ListCameraRequest request);

    /**
     * 静态库查询人员信息
     *
     * @param request
     * @return
     */
    GetPeoplesResponse getStaticLibrariesPeoples(GetPeoplesRequest request);

    /**
     * 静态库查询
     *
     * @param request
     * @return
     */
    ListStaticLibrariesResponse listStaticLibraries(ListStaticLibrariesRequest request);

    /**
     * 数据订阅并获取连接
     */
    SubscriptionResponse subscription(SubscriptionRequest subscriptionRequest);

    /**
     * 数据订阅信息查询
     */
    SearchSubscriptionResponse searchSubscription(SearchSubscriptionRequest searchSubscriptionRequest);

    VCMResponse deleteSubscription(DeleteSubscriptionRequest deleteSubscriptionRequest);

    GetDataDictionaryResponse getDataDictionary(LanguageEnum language, TypeCodeEnum typeCode);

    /**
     * 统计同时在2个时空下的出现的人员和人员次数
     *
     * @param spatiotemporalRequest
     * @return
     */
    SpatiotemporalResponse collide(SpatiotemporalRequest spatiotemporalRequest);

    /**
     * 统计在单时空下的出现的人员和人员次数
     *
     * @param spatiotemporalRequest
     * @return
     */
    SpatiotemporalResponse calcFrequency(SpatiotemporalRequest spatiotemporalRequest);

    /**
     * 获取时空分析任务状态
     *
     * @param taskId
     * @return
     */
    SpatiotemporalResponse getTaskResult(String taskId);

}
